package cn.edu.bzu.ie.sf.mealsmisweb.common;

import javax.swing.text.DateFormatter;
import java.security.MessageDigest;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

/**
 * @version v1.0.0
 * @Package : cn.edu.bzu.ie.sf.mealsmisweb.common
 * @Description : TODO
 * @Create on : 2021/8/7 20:11
 * @author: Feng Song 宋锋
 **/
public class MyUtils {
    /**
     * 获取当前日期时间的字符串
     * @return 返回 yyyy-MM-dd HH:mm:ss 格式的 时间 字符串
     */
    public static String getDateTimeStrFromNow(){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime ldt = LocalDateTime.now();
        return ldt.format(formatter);
    }

    /**
     * 从当前时间中获取年份字符串
     * @return 年份字符串
     */
    public static String getYearStrFromNow(){
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy");
        LocalDateTime ldt = LocalDateTime.now();
        return ldt.format(df);
    }

    /**
     * 获取当前日期的字符串
     * @return 返回 yyyy-MM-dd 格式的 日期 字符串
     */
    public static String getDateStrFromNow(){
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDateTime ldt = LocalDateTime.now();
        return ldt.format(df);
    }

    /**
     * 参考：https://www.cnblogs.com/xiejn/p/12037954.html
     * 获取明天日期的字符串
     * @return 返回 yyyy-MM-dd 格式的 日期 字符串
     */
    public static String getDateStrFromTomorrow(){
        Date dt = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(new Date());
        calendar.add(calendar.DATE, 1);
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取当前年月字符串
     * @return 返回 yyyyMM 格式的 年月 字符串
     */
    public static String getMonthStrFromNow(){
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMM");
        LocalDateTime ldt = LocalDateTime.now();
        return ldt.format(df);
    }

    /**
     * 参考地址：https://blog.csdn.net/chen_heng_Ali/article/details/117048184
     * java8 根据年份和周数获取周一或者周日日期
     * @param category 例如202101，代表2021年第一周
     * @param newValue 1L代表周一，7L代表周日
     * @return 日期 yyyy-MM-dd
     */
    public static LocalDate getWeekDateByCategory(String category, long newValue){
        int year = Integer.valueOf(category.substring(0,4));
        int numWeek = Integer.valueOf(category.substring(4,6));
        WeekFields weekFields= WeekFields.ISO;
        LocalDate now = LocalDate.now();
        LocalDate localDate = now.withYear(year).with(weekFields.weekOfYear(),numWeek);
        LocalDate goalLocalDate  = localDate.with(weekFields.dayOfWeek(), newValue);
        return goalLocalDate;
    }

    /**
     * 参考：https://blog.csdn.net/tianshishangxin1/article/details/107860893
     * 获取当前时间所在的当前周的字符串
     * @return 返回 这是一年中的第几周
     */
    public static Integer getWeekNumOfYear(){
        WeekFields weekFields = WeekFields.of(Locale.getDefault());
        // 取得的周比当前的周多1周，因此要减去1
        return LocalDate.now().get(weekFields.weekOfWeekBasedYear())-1;
    }

    /**
     * 获取当前周的周一到周日的字符串
     * @return 返回 yyyyMMdd1-yyyyMMdd7 周一到周日的日期字符串
     */
    public static String getWeekStrOfNow(){
        LocalDateTime ldt = LocalDateTime.now();
        String str = ldt.getYear() + "" + getWeekNumOfYear();

        LocalDate weekDay1 = getWeekDateByCategory(str, 1l);  // 周一
        LocalDate weekDay7 = getWeekDateByCategory(str, 7l);  // 周日

        DateTimeFormatter dfDate = DateTimeFormatter.ofPattern("yyyyMMdd");
        return weekDay1.format(dfDate) + "-" + weekDay7.format(dfDate);
    }

    /**
     * 参考：https://blog.csdn.net/fengyeqing5/article/details/84816117
     * 获取某个字符串的 md5 字符串
     * @param plainText 原始的字符串
     * @return 加密成md5的字符串
     */
    public static String getMd5Str(String plainText){
        String str = "";
        try {
            //生成实现指定摘要算法的 MessageDigest 对象。
            MessageDigest md = MessageDigest.getInstance("MD5");
            //使用指定的字节数组更新摘要。
            md.update(plainText.getBytes());
            //通过执行诸如填充之类的最终操作完成哈希计算。
            byte b[] = md.digest();
            //生成具体的md5密码到buf数组
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            //System.out.println("32位: " + buf.toString());// 32位的加密
            //System.out.println("16位: " + buf.toString().substring(8, 24));// 16位的加密，其实就是32位加密后的截取
            str = buf.toString();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }

    // 当前类中的测试方法
    public static void main(String[] args){
        System.out.println("今天是一年中第几周："+getWeekNumOfYear());
        System.out.println("当前周的时间段为：" + getWeekStrOfNow());
        // 123456字符串的小写字母的md5码
        System.out.println("123456的md5密码为："+getMd5Str("123456"));
    }

    /**
     * 判断字符串是否为空
     * @param str 要判断的字符串
     * @return 空true，非空false
     */
    public static boolean isEmpty(String str){
        boolean flag = false;   // 标识，不是空
        if(str==null || str=="" || str.equals("")){
            flag = true;
        }
        return flag;
    }
}
